Amazon Cognitoの認証をトリガーにしたときのLambda関数(Python3.6)の書き方
どうも!大阪オフィスの西村祐二です。
ユーザーがサイトにログインしたら何らかの処理を実行させたい、などといったことがよくあると思います。
Amazon CognitoではいろんなフェーズでLambda関数を実行することができます。
そんなCognito認証をトリガーとしてLambda関数を実行させるときにハマってしまったので、
備忘録として今回はそれについて記載したいと思います。
Amazon Cognitoのトリガー設定
Amazon Cognitoでは下記のフェーズでLambda関数を実行することができます。
- サインアップ前
- 認証前
- カスタムメッセージ
- 認証後
- 確認後
- 認証チャレンジの定義
- 認証チャレンジの作成
- 認証チャレンジレスポンスの確認
- トークン生成前
詳細はこちらのドキュメントを確認ください。
マネージメントコンソールからは下記図のように簡単にLambda関数をトリガーとして設定できます。
今回は「認証後(ログイン後)」にLambda関数を実行させるようにしたいと思います。
Lambda関数の作成
今回はPython3.6でどんなデータがeventに含まれるかを確認するだけのLambda関数を作ります。
def lambda_handler(event, context): print(event) return 'end'
ちなみに、Amazon CognitoのマネージメントコンソールからLambda関数を指定しトリガーに設定しても、
指定されたLambda関数のほうでは特に表示されないようです。
動作確認
※Amazon Cognitoを使ったログインサイトの実装は割愛します。
Cognito認証を使ってブラウザ上からログインしてみます。
Lambda関数は問題なく実行されますが、ブラウザ上ではうまくログインできずに
下記のような「Unrecognizable lambda output」というエラーが発生しました。
Lambdaの出力に問題があるのはわかるのですが、
いったいどのような出力にしたらいいかわからず
解決するのにかなり時間がかかりました。
解決策
結論から言うと
eventをretrunすることで
この問題を解消することができました。
つまり、下記のようにreturn event
とすれば問題なくCognito認証を使って正常にログインできました。
def lambda_handler(event, context): print(event) return event
ドキュメントにはNode.jsのサンプルコードしかのってなかったので
きちんと確認していなかったのですが、
サンプルコードの処理の終わりにはcontext.done(error, event);
となってeventを返していました。
ドキュメントはしっかり読まないとダメですね
さいごに
いかがだったでしょうか。
Amazon Cognitoの認証をトリガーにしたときハマったので、それを解決するLambda関数(Python3.6)の書き方について記載しました。
CognitoとLambdaを組み合わせることでいろんなことができそうですね。
誰かの参考になれば幸いです。